package controlador;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

import modelo.Conexion;
import modelo.Equipo;
import modelo.Jugador;
import modelo.Liga;
import modelo.Partido;
import modelo.Umpire;
import modelo.DAO.EquipoDAO;
import modelo.DAO.JugadorDAO;
import modelo.DAO.PartidoDAO;
import modelo.DAO.UmpireDAO;
import vista.VentanaListaEquipoTabla;
import vista.VentanaListaUmpire;
import vista.VentanaListaUmpireTabla;
import vista.VentanaPrincipal;

public class ControladorVentanaPrincipal implements ActionListener{

			private VentanaPrincipal ventanaPrincipal; 
			private VentanaListaUmpire ventanaListaUmpire;
			private Liga liga;
			private EquipoDAO equipoDAO;
			private PartidoDAO partidoDAO;
			private ArrayList<Partido> juganotpart;
			
			public ControladorVentanaPrincipal() {
				ventanaPrincipal= new VentanaPrincipal();
				ventanaPrincipal.setLocationRelativeTo(null);
				ventanaPrincipal.setVisible(true);	
				ventanaPrincipal.agregarListener(this);
				liga = Liga.getInstancia();
				this.cargarUmpires();
				this.cargarEquipos();
				this.cargarPartidos();
			}
			
			// ESTE METODO DEBERIA IR EN EquipoDAO PERO LO INTENTO LLAMAR ALLA Y NO FUNCIONA
			// ERROR: Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
			public void actualizarEquipos(Liga liga){
				for (int i=0; i<liga.contarEquipos(); i++){
					Equipo equipo=liga.getEquipos().get(i);
					String tiraSQL = "UPDATE equipos SET juegosjugados='"+equipo.getjJugados()+"', juegosganados='"+equipo.getjGanados()+"', juegosperdidos='"+equipo.getjPerdidos()+"', diferencia='"+equipo.Diferencia(liga.primerEquipo())+"' WHERE codequipo = '"+equipo.getCodigo()+"';";
					Conexion.ejecutar(tiraSQL);
				}
			}
			
			// ESTE METODO DEBERIA IR EN UmpireDAO PERO LO INTENTO LLAMAR ALLA Y NO FUNCIONA
			// ERROR: Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
			public void actualizarUmpires(Liga liga){
				for (int i=0; i<liga.contarUmpires(); i++){
					Umpire umpire=liga.getUmpires().get(i);
					String tiraSQL = "UPDATE umpires SET juegosarbit='"+umpire.getjArbitrados()+"' WHERE cedula = '"+umpire.getCedula()+"';";
					Conexion.ejecutar(tiraSQL);
				}
			}
			
			// ESTE METODO DEBERIA IR EN PartidoDAO PERO LO INTENTO LLAMAR ALLA Y NO FUNCIONA
			// ERROR: Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
			public void actualizarPartJug(Liga liga){
				for (int i=0; i<liga.contarAnotaciones(); i++){
					Partido partido=liga.getJugAnotPart().get(i);
					String tiraSQL = "INSERT INTO partidojugador VALUES ('"+partido.getCodigo()+"','"+partido.getCedjugAnot()+"','"+partido.getCuadJug()+"','"+partido.getCarrJug()+"')";
					Conexion.ejecutar(tiraSQL);
				}
			}
			
			private void cargarEquipos(){
				EquipoDAO equipoDAO = new EquipoDAO();
				ArrayList<Equipo> equipos = equipoDAO.consultarEquipos();
				for (int i=0; i<equipos.size(); i++){
					liga.registrarEquipo(equipos.get(i));
					JugadorDAO jugadorDAO = new JugadorDAO();
					ArrayList<Jugador> jugadores = jugadorDAO.consultarJugadores(equipos.get(i).getCodigo());
					equipos.get(i).setJugadores(jugadores);
					}
			}
			 
			private void cargarUmpires(){
				UmpireDAO umpireDAO = new UmpireDAO();
				ArrayList<Umpire> umpires = umpireDAO.consultarUmpires();
				for (int i=0; i<umpires.size(); i++){
					liga.registrarUmpire(umpires.get(i));
				}
			}
	
			private void cargarPartidos(){
				PartidoDAO partidoDAO = new PartidoDAO();
				ArrayList<Partido> partidos = partidoDAO.consultarPartidos();
				for (int i=0; i<partidos.size(); i++){
					liga.registrarPartido(partidos.get(i));
				}
			}

			public void actionPerformed(ActionEvent e) {
				
				ControladorVentanaUmpire controladorVentanaUmpire;
				ControladorVentanaListaUmpire controladorVentanaListaUmpire;
				ControladorVentanaEquipo controladorVentanaEquipo;
				ControladorVentanaListaEquipo controladorVentanaListaEquipo;
				ControladorVentanaPlayoff controladorVentanaPlayoff;

				if (e.getActionCommand().equalsIgnoreCase("Umpires")){
					if (liga.contarUmpires() == 0){
						ventanaPrincipal.mostrarMensaje("Aun no se han registrado Umpires en la liga");
						controladorVentanaUmpire= new ControladorVentanaUmpire(liga);
					}
					else {
						controladorVentanaListaUmpire = new ControladorVentanaListaUmpire(liga);
					}
				}	
				else 
					if (e.getActionCommand().equalsIgnoreCase("Equipos")){
						if (liga.contarEquipos() == 0){
							ventanaPrincipal.mostrarMensaje("Aun no se han registrado equipos en la liga");
							controladorVentanaEquipo= new ControladorVentanaEquipo(liga);	
							}
							else  {
								controladorVentanaListaEquipo = new ControladorVentanaListaEquipo(liga);
							}
					}
					else
						if(liga.contarEquipos()<= 5){
							ventanaPrincipal.mostrarMensaje("Debe registrar mas de 5 equipos, tiene "+liga.contarEquipos());
							controladorVentanaEquipo= new ControladorVentanaEquipo(liga);
							
							}
						else
							if (liga.contarUmpires()<((liga.contarEquipos()/2)-1)){
								ventanaPrincipal.mostrarMensaje("Debe registrar "+(liga.contarEquipos()/2)+" o mas umpires, tiene "+liga.contarUmpires());
								controladorVentanaUmpire= new ControladorVentanaUmpire(liga);
							}
							else{
								//if(liga.getPartidos().size()==0){
									liga.CrearCalendario();
									actualizarEquipos(liga);
									actualizarUmpires(liga);
									actualizarPartJug(liga);
									//equipoDAO.actualizarEquipos(liga);
									//umpireDAO.actualizarUmpires(liga);
									//partidoDAO.actualizarPartJug(liga);
									
									controladorVentanaPlayoff = new ControladorVentanaPlayoff(liga);
								/*}
								else{
									controladorVentanaPlayoff = new ControladorVentanaPlayoff(liga);
								}*/
							}
			}

}